<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>🧝‍♂️ 进程与线程 | Xiangyu&#39;s Blog</title>
    <meta name="generator" content="VuePress 1.8.2">
    <script src="https://cdn.jsdelivr.net/npm/react/umd/react.production.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/react-dom/umd/react-dom.production.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@babel/standalone/babel.min.js"></script>
    <link rel="alternate" type="application/atom+xml" href="https://blog.lixiangyu.xyz/atom.xml" title="Xiangyu&#39;s Blog Atom Feed">
    <link rel="alternate" type="application/json" href="https://blog.lixiangyu.xyz/feed.json" title="Xiangyu&#39;s Blog JSON Feed">
    <link rel="alternate" type="application/rss+xml" href="https://blog.lixiangyu.xyz/rss.xml" title="Xiangyu&#39;s Blog RSS Feed">
    <meta name="description" content="">
    <meta property="og:url" content="/interview/os/process-thread.html">
    <meta property="og:site_name" content="Xiangyu's Blog">
    <meta property="og:title" content="🧝‍♂️ 进程与线程">
    <meta property="og:type" content="article">
    <meta property="og:locale" content="zh-CN">
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:image:alt" content="Xiangyu's Blog">
    <meta property="article:author" content="Xiangyu Li">
    
    <link rel="preload" href="/assets/css/0.styles.79654418.css" as="style"><link rel="preload" href="/assets/js/app.a42375e9.js" as="script"><link rel="preload" href="/assets/js/vendors~layout-Layout.8269724e.js" as="script"><link rel="preload" href="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound.43b0f70d.js" as="script"><link rel="preload" href="/assets/js/page-🧝‍♂️进程与线程.f1df829e.js" as="script"><link rel="preload" href="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound~layout-Slide.99c28334.js" as="script"><link rel="prefetch" href="/assets/js/120.3fbfaa84.js"><link rel="prefetch" href="/assets/js/121.1b7d4f7b.js"><link rel="prefetch" href="/assets/js/122.beff33c9.js"><link rel="prefetch" href="/assets/js/123.b1ea2b2a.js"><link rel="prefetch" href="/assets/js/124.80db1ca6.js"><link rel="prefetch" href="/assets/js/layout-Blog.5897b816.js"><link rel="prefetch" href="/assets/js/layout-Layout.62afd99c.js"><link rel="prefetch" href="/assets/js/layout-NotFound.232bd0de.js"><link rel="prefetch" href="/assets/js/layout-Slide.3e86b53c.js"><link rel="prefetch" href="/assets/js/mermaid.efa5ef99.js"><link rel="prefetch" href="/assets/js/page-☀️类加载机制.e96f671b.js"><link rel="prefetch" href="/assets/js/page-☘️通讯组件-简介.4b81f185.js"><link rel="prefetch" href="/assets/js/page-♟️百度.c4749d47.js"><link rel="prefetch" href="/assets/js/page-⛈️Map接口-简介.3865d2e3.js"><link rel="prefetch" href="/assets/js/page-⛑️HTTPS协议.66168577.js"><link rel="prefetch" href="/assets/js/page-⛷️TreeSet.9d82d551.js"><link rel="prefetch" href="/assets/js/page-⛹️LinkedHashMap.a11fa0e5.js"><link rel="prefetch" href="/assets/js/page-✈️Kafka.02647d0b.js"><link rel="prefetch" href="/assets/js/page-✌️索引.8092b72a.js"><link rel="prefetch" href="/assets/js/page-⭐内存区域划分.b3f4a65e.js"><link rel="prefetch" href="/assets/js/page-主页.28a585f2.js"><link rel="prefetch" href="/assets/js/page-🌀JVM-简介.cbd691d7.js"><link rel="prefetch" href="/assets/js/page-🌀JavaIO-简介.8b218ef6.js"><link rel="prefetch" href="/assets/js/page-🌀Java基础-简介.3cff2536.js"><link rel="prefetch" href="/assets/js/page-🌀Java容器-简介.21a7bf8b.js"><link rel="prefetch" href="/assets/js/page-🌀Java并发-简介.a400b8d1.js"><link rel="prefetch" href="/assets/js/page-🌀MySQL-简介.61b33b6a.js"><link rel="prefetch" href="/assets/js/page-🌀Redis-简介.f815bad6.js"><link rel="prefetch" href="/assets/js/page-🌀中间件-简介.5640181c.js"><link rel="prefetch" href="/assets/js/page-🌀操作系统-简介.46e7356e.js"><link rel="prefetch" href="/assets/js/page-🌀框架使用-简介.3af4c120.js"><link rel="prefetch" href="/assets/js/page-🌀计算机网络-简介.23bd59fd.js"><link rel="prefetch" href="/assets/js/page-🌀设计思想-简介.0711e244.js"><link rel="prefetch" href="/assets/js/page-🌀面经.5cfe0142.js"><link rel="prefetch" href="/assets/js/page-🌙垃圾回收机制.db23d79a.js"><link rel="prefetch" href="/assets/js/page-🌧️Set接口-简介.d19cf767.js"><link rel="prefetch" href="/assets/js/page-🌩️List接口-简介.112f20b7.js"><link rel="prefetch" href="/assets/js/page-🌲Spring.bc450c2f.js"><link rel="prefetch" href="/assets/js/page-🌳SpringMVC.91b7e35a.js"><link rel="prefetch" href="/assets/js/page-🌴SpringBoot.ff4435cc.js"><link rel="prefetch" href="/assets/js/page-🌵SpringCloud.61f20500.js"><link rel="prefetch" href="/assets/js/page-🌻MyBatis.2d99e7fc.js"><link rel="prefetch" href="/assets/js/page-🌼MyBatis框架-简介.66f9a744.js"><link rel="prefetch" href="/assets/js/page-🍀Netty.54e2d65a.js"><link rel="prefetch" href="/assets/js/page-🍁Dubbo.66727d8a.js"><link rel="prefetch" href="/assets/js/page-🎧学堂在线.81d9ee7e.js"><link rel="prefetch" href="/assets/js/page-🎭Boss直聘.14beba08.js"><link rel="prefetch" href="/assets/js/page-🎱老虎集团.fc8b12ba.js"><link rel="prefetch" href="/assets/js/page-🎲字节跳动.5676ea28.js"><link rel="prefetch" href="/assets/js/page-🎺猿辅导.7520f1e7.js"><link rel="prefetch" href="/assets/js/page-🏄LinkedHashSet.2e22c9f1.js"><link rel="prefetch" href="/assets/js/page-🏌️HashSet.820baa69.js"><link rel="prefetch" href="/assets/js/page-🐒锁.868714d5.js"><link rel="prefetch" href="/assets/js/page-🐵JUC.9672a0f1.js"><link rel="prefetch" href="/assets/js/page-👂视图.f277e783.js"><link rel="prefetch" href="/assets/js/page-👋数据类型.b99f167f.js"><link rel="prefetch" href="/assets/js/page-👍事务.ef00d241.js"><link rel="prefetch" href="/assets/js/page-👎慢查询.a1afcd91.js"><link rel="prefetch" href="/assets/js/page-👓IP地址.f0579df2.js"><link rel="prefetch" href="/assets/js/page-👕其他.647a9b2f.js"><link rel="prefetch" href="/assets/js/page-👟滑动窗口.b3cb4c10.js"><link rel="prefetch" href="/assets/js/page-👣IP协议基础.c423881a.js"><link rel="prefetch" href="/assets/js/page-👨‍💼TCP协议-简介.8dad7177.js"><link rel="prefetch" href="/assets/js/page-👨‍🔧IP-简介.45549536.js"><link rel="prefetch" href="/assets/js/page-👨‍🔧设计模式.2b288cfc.js"><link rel="prefetch" href="/assets/js/page-💁‍♂️Redis事务.2da37f16.js"><link rel="prefetch" href="/assets/js/page-💂面试知识点整理.53653cc8.js"><link rel="prefetch" href="/assets/js/page-💍HTTP协议的改进.9d91d303.js"><link rel="prefetch" href="/assets/js/page-💐Spring全家桶-简介.bc0ceb52.js"><link rel="prefetch" href="/assets/js/page-💼HTTP协议的请求方法.49ea5b30.js"><link rel="prefetch" href="/assets/js/page-🖐️存储引擎.51e90aae.js"><link rel="prefetch" href="/assets/js/page-🖖DDL.58e99d50.js"><link rel="prefetch" href="/assets/js/page-😀面向对象的特点.64db987a.js"><link rel="prefetch" href="/assets/js/page-😁Object类.bd3dee32.js"><link rel="prefetch" href="/assets/js/page-😆String类.6fe32326.js"><link rel="prefetch" href="/assets/js/page-😎泛型.9245d81a.js"><link rel="prefetch" href="/assets/js/page-😛关键字.1e781f13.js"><link rel="prefetch" href="/assets/js/page-😪反射.ef7a385f.js"><link rel="prefetch" href="/assets/js/page-😵异常.6c2ba11a.js"><link rel="prefetch" href="/assets/js/page-🙅‍♂️Redis淘汰策略.650f7bea.js"><link rel="prefetch" href="/assets/js/page-🙆‍♂️Redis持久化策略.d130b1b1.js"><link rel="prefetch" href="/assets/js/page-🙇‍♂️Redis基础.2c3c39e8.js"><link rel="prefetch" href="/assets/js/page-🙈JMM.3512b22b.js"><link rel="prefetch" href="/assets/js/page-🙉进程和线程.f7aa9975.js"><link rel="prefetch" href="/assets/js/page-🙊线程池.bab2c4d8.js"><link rel="prefetch" href="/assets/js/page-🙋‍♂️Redis底层实现.7416ea6f.js"><link rel="prefetch" href="/assets/js/page-🚥ZooKeeper.57458d21.js"><link rel="prefetch" href="/assets/js/page-🚵HashTable.ccce702b.js"><link rel="prefetch" href="/assets/js/page-🚶‍♂️超时重传机制.cfb21e2f.js"><link rel="prefetch" href="/assets/js/page-🤚范式.b6a8d503.js"><link rel="prefetch" href="/assets/js/page-🤝集群.bdd1180d.js"><link rel="prefetch" href="/assets/js/page-🤞锁.c12200cd.js"><link rel="prefetch" href="/assets/js/page-🤦‍♂️故障处理.80248294.js"><link rel="prefetch" href="/assets/js/page-🤪包装类和缓存池.4fa40654.js"><link rel="prefetch" href="/assets/js/page-🤴HTTP协议-简介.c55283d9.js"><link rel="prefetch" href="/assets/js/page-🤸ArrayList.f0cf8991.js"><link rel="prefetch" href="/assets/js/page-🤹LinkedList.caf8cd71.js"><link rel="prefetch" href="/assets/js/page-🤼HashMap.2ad7d223.js"><link rel="prefetch" href="/assets/js/page-🤾Vector.7740cb05.js"><link rel="prefetch" href="/assets/js/page-🥁好大夫在线.e46779d8.js"><link rel="prefetch" href="/assets/js/page-🦍无同步方案.9b8df198.js"><link rel="prefetch" href="/assets/js/page-🧏‍♂️Redis集群.6d3441ab.js"><link rel="prefetch" href="/assets/js/page-🧐其他.deb18f3f.js"><link rel="prefetch" href="/assets/js/page-🧘ConcurrentHashMap.a3e51c7d.js"><link rel="prefetch" href="/assets/js/page-🧙‍♂️内存管理.c1b418f2.js"><link rel="prefetch" href="/assets/js/page-🧚CPU缓存一致性.8647e92e.js"><link rel="prefetch" href="/assets/js/page-🧛‍♂️IO.3bf30d07.js"><link rel="prefetch" href="/assets/js/page-🧟锁.86b4ff29.js"><link rel="prefetch" href="/assets/js/page-🧣TCP协议基础.2e717ff6.js"><link rel="prefetch" href="/assets/js/page-🧤拥塞控制.9018c6ff.js"><link rel="prefetch" href="/assets/js/page-🧥HTTP协议基础.719b302d.js"><link rel="prefetch" href="/assets/js/page-🧩美团.7049187d.js"><link rel="prefetch" href="/assets/js/page-🧳建立与释放连接.b95bfaf5.js"><link rel="prefetch" href="/assets/js/page-🧶元保数科.aba682de.js"><link rel="prefetch" href="/assets/js/vendors~flowchart.846214db.js"><link rel="prefetch" href="/assets/js/vendors~mermaid.4a0cbbd3.js"><link rel="prefetch" href="/assets/js/vendors~photo-swipe.515ad438.js"><link rel="prefetch" href="/assets/js/vendors~reveal.b4fb0aa4.js"><link rel="prefetch" href="/assets/js/vendors~waline.c2d7e472.js">
    <link rel="stylesheet" href="/assets/css/0.styles.79654418.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container has-navbar has-sidebar has-anchor"><header class="navbar"><!----> <div class="content__navbar-start"></div> <button title="Sidebar Button" class="sidebar-button"><span class="icon"></span></button> <a href="/" class="home-link router-link-active"><img src="/icon.png" alt="Xiangyu's Blog" class="logo"> <!----> <span class="site-name can-hide">Xiangyu's Blog</span></a> <!----> <div class="content__navbar-center"></div> <div class="links"><button aria-hidden="true" class="color-button"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="skin-icon"><path d="M224 800c0 9.6 3.2 44.8 6.4 54.4 6.4 48-48 76.8-48 76.8s80 41.6 147.2 0 134.4-134.4
        38.4-195.2c-22.4-12.8-41.6-19.2-57.6-19.2C259.2 716.8 227.2 761.6 224 800zM560 675.2l-32
        51.2c-51.2 51.2-83.2 32-83.2 32 25.6 67.2 0 112-12.8 128 25.6 6.4 51.2 9.6 80 9.6 54.4 0
        102.4-9.6 150.4-32l0 0c3.2 0 3.2-3.2 3.2-3.2 22.4-16 12.8-35.2
        6.4-44.8-9.6-12.8-12.8-25.6-12.8-41.6 0-54.4 60.8-99.2 137.6-99.2 6.4 0 12.8 0 22.4
        0 12.8 0 38.4 9.6 48-25.6 0-3.2 0-3.2 3.2-6.4 0-3.2 3.2-6.4 3.2-6.4 6.4-16 6.4-16 6.4-19.2
        9.6-35.2 16-73.6 16-115.2 0-105.6-41.6-198.4-108.8-268.8C704 396.8 560 675.2 560 675.2zM224
        419.2c0-28.8 22.4-51.2 51.2-51.2 28.8 0 51.2 22.4 51.2 51.2 0 28.8-22.4 51.2-51.2 51.2C246.4
        470.4 224 448 224 419.2zM320 284.8c0-22.4 19.2-41.6 41.6-41.6 22.4 0 41.6 19.2 41.6 41.6 0
        22.4-19.2 41.6-41.6 41.6C339.2 326.4 320 307.2 320 284.8zM457.6 208c0-12.8 12.8-25.6 25.6-25.6
        12.8 0 25.6 12.8 25.6 25.6 0 12.8-12.8 25.6-25.6 25.6C470.4 233.6 457.6 220.8 457.6 208zM128
        505.6C128 592 153.6 672 201.6 736c28.8-60.8 112-60.8 124.8-60.8-16-51.2 16-99.2
        16-99.2l316.8-422.4c-48-19.2-99.2-32-150.4-32C297.6 118.4 128 291.2 128 505.6zM764.8
        86.4c-22.4 19.2-390.4 518.4-390.4 518.4-22.4 28.8-12.8 76.8 22.4 99.2l9.6 6.4c35.2 22.4
        80 12.8 99.2-25.6 0 0 6.4-12.8 9.6-19.2 54.4-105.6 275.2-524.8 288-553.6
        6.4-19.2-3.2-32-19.2-32C777.6 76.8 771.2 80 764.8 86.4z"></path></svg> <div class="color-picker-menu" style="display:none;"><div class="theme-options"><ul class="themecolor-select"><label for="themecolor-select">主题色:</label> <li><span class="default-theme"></span></li> </ul> <div class="darkmode-toggle"><label for="darkmode-toggle" class="desc">主题模式:</label> <div class="darkmode-switch"><div class="item day"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon light-icon"><path d="M512 256a42.667 42.667 0 0 0 42.667-42.667V128a42.667 42.667 0 0 0-85.334 0v85.333A42.667 42.667 0 0 0 512 256zm384 213.333h-85.333a42.667 42.667 0 0 0 0 85.334H896a42.667 42.667 0 0 0 0-85.334zM256 512a42.667 42.667 0 0 0-42.667-42.667H128a42.667 42.667 0 0 0 0 85.334h85.333A42.667 42.667 0 0 0 256 512zm9.387-298.667a42.667 42.667 0 0 0-59.307 62.72l61.44 59.307a42.667 42.667 0 0 0 31.147 11.947 42.667 42.667 0 0 0 30.72-13.227 42.667 42.667 0 0 0 0-60.16zm459.946 133.974a42.667 42.667 0 0 0 29.44-11.947l61.44-59.307a42.667 42.667 0 0 0-57.6-62.72l-61.44 60.587a42.667 42.667 0 0 0 0 60.16 42.667 42.667 0 0 0 28.16 13.227zM512 768a42.667 42.667 0 0 0-42.667 42.667V896a42.667 42.667 0 0 0 85.334 0v-85.333A42.667 42.667 0 0 0 512 768zm244.48-79.36a42.667 42.667 0 0 0-59.307 61.44l61.44 60.587a42.667 42.667 0 0 0 29.44 11.946 42.667 42.667 0 0 0 30.72-12.8 42.667 42.667 0 0 0 0-60.586zm-488.96 0-61.44 59.307a42.667 42.667 0 0 0 0 60.586 42.667 42.667 0 0 0 30.72 12.8 42.667 42.667 0 0 0 28.587-10.666l61.44-59.307a42.667 42.667 0 0 0-59.307-61.44zM512 341.333A170.667 170.667 0 1 0 682.667 512 170.667 170.667 0 0 0 512 341.333z" fill="currentColor"></path></svg></div> <div class="item auto active"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon auto-icon"><path d="M460.864 539.072H564.8L510.592 376l-49.728 163.072zM872 362.368V149.504H659.648L510.528 0l-149.12 149.504H149.12v212.928L0 511.872l149.12 149.504v212.928h212.352l149.12 149.504 149.12-149.504h212.352V661.376l149.12-149.504L872 362.368zM614.464 693.12l-31.616-90.624H438.272l-31.616 90.624h-85.888l144.576-407.68h90.368l144.576 407.68h-85.824zm0 0" fill="currentColor"></path></svg></div> <div class="item night"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon dark-icon"><path d="M935.539 630.402c-11.43-11.432-28.674-14.739-43.531-8.354-46.734 20.103-96.363 30.297-147.508 30.297-99.59 0-193.221-38.784-263.64-109.203-108.637-108.637-139.61-270.022-78.908-411.148a39.497 39.497 0 0 0-51.886-51.887c-52.637 22.64-100.017 54.81-140.826 95.616-85.346 85.346-132.346 198.821-132.346 319.52 0 120.7 47.001 234.172 132.347 319.519S408.063 947.11 528.76 947.11c120.7 0 234.172-47.003 319.52-132.351 40.809-40.81 72.978-88.19 95.616-140.826a39.497 39.497 0 0 0-8.356-43.532z" fill="currentColor"></path></svg></div></div> <!----></div></div></div></button> <div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link router-link-active"><i class="iconfont icon-home"></i>
  主页
</a></div><div class="nav-item"><a href="/interview/" class="nav-link router-link-active active"><i class="iconfont icon-launch"></i>
  面试题整理
</a></div></nav> <!----> <a rel="noopener noreferrer" href="https://github.com/lxy1152/lxy1152.github.io" target="_blank" class="repo-link can-hide">
  GitHub
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> <!----> <div class="content__navbar-end"></div></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><!----> <!----> <div class="content__sidebar-top"></div> <nav class="sidebar-nav-links"><div class="nav-item"><a href="/" class="nav-link router-link-active"><i class="iconfont icon-home"></i>
  主页
</a></div><div class="nav-item"><a href="/interview/" class="nav-link router-link-active active"><i class="iconfont icon-launch"></i>
  面试题整理
</a></div> <a rel="noopener noreferrer" href="https://github.com/lxy1152/lxy1152.github.io" target="_blank" class="repo-link">
  GitHub
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <!----> <div class="content__sidebar-center"></div> <ul class="sidebar-links"><li><a href="/interview/" aria-current="page" class="sidebar-link">💂 面试知识点整理</a></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">😉 Java 基础</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">🌈 Java 容器</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">🐺 Java 并发</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">⛳ Java I/O</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">🌏 JVM</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">🌱 框架使用</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">👊 MySQL</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">🤷‍♂️ Redis</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">🎠 中间件</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">👨‍👧‍👧 计算机网络</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable open"><!----> <span class="title">🦸 操作系统</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/interview/os/" aria-current="page" class="sidebar-link">🌀 操作系统 - 简介</a></li><li><a href="/interview/os/memory/" class="sidebar-link">🧙‍♂️ 内存管理</a></li><li><a href="/interview/os/cpu-cache/" class="sidebar-link">🧚 CPU 缓存一致性</a></li><li><a href="/interview/os/process-thread/" aria-current="page" class="active sidebar-link">🧝‍♂️ 进程与线程</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#进程" class="sidebar-link">进程</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#并发和并行的区别" class="sidebar-link heading3">并发和并行的区别？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#进程有哪几个状态" class="sidebar-link heading3">进程有哪几个状态？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#什么是进程控制块" class="sidebar-link heading3">什么是进程控制块？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#什么是进程的上下文切换" class="sidebar-link heading3">什么是进程的上下文切换？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#哪些情况会引发线程上下文切换" class="sidebar-link heading3">哪些情况会引发线程上下文切换？</a></li></ul></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#线程" class="sidebar-link">线程</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#什么是线程" class="sidebar-link heading3">什么是线程？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#线程与进程的比较" class="sidebar-link heading3">线程与进程的比较？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#什么是线程的上下文切换" class="sidebar-link heading3">什么是线程的上下文切换？</a></li></ul></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#调度" class="sidebar-link">调度</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#什么情况下会发生调度" class="sidebar-link heading3">什么情况下会发生调度？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#cpu-调度的基本原则" class="sidebar-link heading3">CPU 调度的基本原则？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#有哪些调度算法" class="sidebar-link heading3">有哪些调度算法？</a></li></ul></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#进程间的通信方式" class="sidebar-link">进程间的通信方式</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#为什么要进行进程间通信" class="sidebar-link heading3">为什么要进行进程间通信？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#如何通过管道实现进程间通信" class="sidebar-link heading3">如何通过管道实现进程间通信？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#如何通过消息队列实现进程间通信" class="sidebar-link heading3">如何通过消息队列实现进程间通信？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#如何通过共享内存实现进程间通信" class="sidebar-link heading3">如何通过共享内存实现进程间通信？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#如何通过信号量实现进程间通信" class="sidebar-link heading3">如何通过信号量实现进程间通信？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#如何通过信号实现进程间通信" class="sidebar-link heading3">如何通过信号实现进程间通信？</a></li><li class="sidebar-sub-header"><a href="/interview/os/process-thread/#如何通过-socket-实现进程间通信" class="sidebar-link heading3">如何通过 Socket 实现进程间通信？</a></li></ul></li></ul></li><li><a href="/interview/os/lock/" class="sidebar-link">🧟 锁</a></li><li><a href="/interview/os/io/" class="sidebar-link">🧛‍♂️ I/O</a></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">🏭 设计思想</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">📚 面经</span> <span class="arrow right"></span></p> <!----></section></li></ul> <!----> <div class="content__sidebar-bottom"></div> <!----></aside> <main class="page"><nav class="breadcrumb"><ol vocab="https://schema.org/" typeof="BreadcrumbList"><li property="itemListElement" typeof="ListItem"><a href="/interview/" property="item" typeof="WebPage" class="router-link-active"><!----> <span property="name">💂 面试知识点整理</span></a> <meta property="position" content="1"></li><li property="itemListElement" typeof="ListItem"><a href="/interview/os/" property="item" typeof="WebPage" class="router-link-active"><!----> <span property="name">🌀 操作系统 - 简介</span></a> <meta property="position" content="2"></li><li property="itemListElement" typeof="ListItem" class="is-active"><a href="/interview/os/process-thread/" aria-current="page" property="item" typeof="WebPage" class="router-link-exact-active router-link-active"><!----> <span property="name">🧝‍♂️ 进程与线程</span></a> <meta property="position" content="3"></li></ol></nav> <!----> <div class="content__page-top"></div> <div vocab="https://schema.org/" typeof="Article" class="page-title"><h1><!----> <span property="headline">🧝‍♂️ 进程与线程</span></h1> <div class="page-info"><!----> <span aria-label="作者🖊" data-balloon-pos="down"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon author-icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z" fill="currentColor"></path></svg> <span property="author">Xiangyu Li</span></span><span aria-label="访问量🔢" data-balloon-pos="down" class="visitor-info"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon eye-icon"><path d="M992 512.096c0-5.76-.992-10.592-1.28-11.136-.192-2.88-1.152-8.064-2.08-10.816-.256-.672-.544-1.376-.832-2.08-.48-1.568-1.024-3.104-1.6-4.32C897.664 290.112 707.104 160 512 160c-195.072 0-385.632 130.016-473.76 322.592-1.056 2.112-1.792 4.096-2.272 5.856a55.512 55.512 0 0 0-.64 1.6c-1.76 5.088-1.792 8.64-1.632 7.744-.832 3.744-1.568 11.168-1.568 11.168-.224 2.272-.224 4.032.032 6.304 0 0 .736 6.464 1.088 7.808.128 1.824.576 4.512 1.12 6.976h-.032c.448 2.08 1.12 4.096 1.984 6.08.48 1.536.992 2.976 1.472 4.032C126.432 733.856 316.992 864 512 864c195.136 0 385.696-130.048 473.216-321.696 1.376-2.496 2.24-4.832 2.848-6.912.256-.608.48-1.184.672-1.728 1.536-4.48 1.856-8.32 1.728-8.32l-.032.032c.608-3.104 1.568-7.744 1.568-13.28zM512 672c-88.224 0-160-71.776-160-160s71.776-160 160-160 160 71.776 160 160-71.776 160-160 160z" fill="currentColor"></path></svg> <span id="/interview/os/process-thread/" data-flag-title="🧝‍♂️ 进程与线程" class="leancloud_visitors"><span class="leancloud-visitors-count">...</span></span></span><span aria-label="写作日期📅" data-balloon-pos="down" class="time-info"><svg viewBox="0 0 1030 1024" xmlns="http://www.w3.org/2000/svg" class="icon calendar-icon"><path d="M716.4 110.137c0-18.753-14.72-33.473-33.472-33.473-18.753 0-33.473 14.72-33.473 33.473v33.473h66.993v-33.473zm-334.87 0c0-18.753-14.72-33.473-33.473-33.473s-33.52 14.72-33.52 33.473v33.473h66.993v-33.473zm468.81 33.52H716.4v100.465c0 18.753-14.72 33.473-33.472 33.473a33.145 33.145 0 0 1-33.473-33.473V143.657H381.53v100.465c0 18.753-14.72 33.473-33.473 33.473a33.145 33.145 0 0 1-33.473-33.473V143.657H180.6A134.314 134.314 0 0 0 46.66 277.595v535.756A134.314 134.314 0 0 0 180.6 947.289h669.74a134.36 134.36 0 0 0 133.94-133.938V277.595a134.314 134.314 0 0 0-133.94-133.938zm33.473 267.877H147.126a33.145 33.145 0 0 1-33.473-33.473c0-18.752 14.72-33.473 33.473-33.473h736.687c18.752 0 33.472 14.72 33.472 33.473a33.145 33.145 0 0 1-33.472 33.473z" fill="currentColor"></path></svg> <span property="datePublished">2021-8-1</span></span><!----><!----><span aria-label="阅读时间⌛" data-balloon-pos="down" class="reading-time-info"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon timer-icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z" fill="currentColor"></path></svg> <span>大约 13 分钟</span> <meta property="timeRequired" content="PT13M"></span></div> <!----> <hr></div> <div class="anchor-place-holder"><aside id="anchor"><div class="anchor-wrapper"><ul class="anchor-list"><li class="anchor"><a href="/interview/os/process-thread/#进程" class="anchor-link heading2"><div>进程</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#并发和并行的区别" class="anchor-link heading3"><div>并发和并行的区别？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#进程有哪几个状态" class="anchor-link heading3"><div>进程有哪几个状态？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#什么是进程控制块" class="anchor-link heading3"><div>什么是进程控制块？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#什么是进程的上下文切换" class="anchor-link heading3"><div>什么是进程的上下文切换？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#哪些情况会引发线程上下文切换" class="anchor-link heading3"><div>哪些情况会引发线程上下文切换？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#线程" class="anchor-link heading2"><div>线程</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#什么是线程" class="anchor-link heading3"><div>什么是线程？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#线程与进程的比较" class="anchor-link heading3"><div>线程与进程的比较？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#什么是线程的上下文切换" class="anchor-link heading3"><div>什么是线程的上下文切换？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#调度" class="anchor-link heading2"><div>调度</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#什么情况下会发生调度" class="anchor-link heading3"><div>什么情况下会发生调度？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#cpu-调度的基本原则" class="anchor-link heading3"><div>CPU 调度的基本原则？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#有哪些调度算法" class="anchor-link heading3"><div>有哪些调度算法？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#进程间的通信方式" class="anchor-link heading2"><div>进程间的通信方式</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#为什么要进行进程间通信" class="anchor-link heading3"><div>为什么要进行进程间通信？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#如何通过管道实现进程间通信" class="anchor-link heading3"><div>如何通过管道实现进程间通信？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#如何通过消息队列实现进程间通信" class="anchor-link heading3"><div>如何通过消息队列实现进程间通信？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#如何通过共享内存实现进程间通信" class="anchor-link heading3"><div>如何通过共享内存实现进程间通信？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#如何通过信号量实现进程间通信" class="anchor-link heading3"><div>如何通过信号量实现进程间通信？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#如何通过信号实现进程间通信" class="anchor-link heading3"><div>如何通过信号实现进程间通信？</div></a></li><li class="anchor"><a href="/interview/os/process-thread/#如何通过-socket-实现进程间通信" class="anchor-link heading3"><div>如何通过 Socket 实现进程间通信？</div></a></li></ul></div></aside></div> <!----> <div class="content__content-top"></div> <div class="theme-default-content content__default"><h2 id="进程"><a href="#进程" class="header-anchor">#</a> 进程</h2> <h3 id="并发和并行的区别"><a href="#并发和并行的区别" class="header-anchor">#</a> 并发和并行的区别？</h3> <ul><li>并发：能够处理多个任务，但不一定同时</li> <li>并行：能够处理多个任务，并且能够同时执行（只要速度足够快，看起来就像是在同时执行）</li></ul> <h3 id="进程有哪几个状态"><a href="#进程有哪几个状态" class="header-anchor">#</a> 进程有哪几个状态？</h3> <div class="custom-block center"><p><img src="https://i.loli.net/2021/08/01/Sdlb9XfRaGqYLUm.png" alt="进程状态1.png"></p></div> <p>如果有大量处于阻塞状态的进程，进程可能会占用着物理内存空间，非常浪费空间。所以在使用虚拟内存管理的操作系统中，通常会把处于阻塞状态的进程的物理内存空间换出到硬盘，等需要再次运行的时候再从硬盘换入到物理内存。通过挂起状态来描述这种行为。</p> <p>挂起状态又分为：</p> <ul><li>阻塞挂起：进程在外存（硬盘）并等待某个事件的出现</li> <li>就绪挂起：进程在外存（硬盘），但只要进入内存，那么立刻就会运行（比如通过 Ctrl+Z 挂起进程）</li></ul> <div class="custom-block center"><p><img src="https://i.loli.net/2021/08/01/RPVBXA2zmdyJptn.png" alt="进程状态2.png"></p></div> <h3 id="什么是进程控制块"><a href="#什么是进程控制块" class="header-anchor">#</a> 什么是进程控制块？</h3> <p>进程控制块（process control block，PCB）是操作系统用来描述进程的一种数据结构。一个进程必然会对应一个 PCB，如果进程结束了，那么 PCB 也会随之消失。一个 PCB 中会包含以下信息：</p> <ul><li>进程描述信息
<ul><li>进程标识符：标识各个进程，每个进程都有一个并且唯一的标识符</li> <li>用户标识符：进程归属的用户，用户标识符主要为共享和保护服务</li></ul></li> <li>进程控制和管理信息
<ul><li>进程当前状态：如 new、ready、running、waiting 或 blocked 等</li> <li>进程优先级：进程抢占 CPU 时的优先级</li></ul></li> <li>资源分配清单
<ul><li>有关内存地址空间或虚拟地址空间的信息，所打开文件的列表和所使用的 I/O 设备信息</li></ul></li> <li>CPU 相关信息
<ul><li>CPU 中各个寄存器的值，当进程被切换时，CPU 的状态信息都会被保存在相应的 PCB 中，以便进程重新执行时，能从断点处继续执行</li></ul></li></ul> <h3 id="什么是进程的上下文切换"><a href="#什么是进程的上下文切换" class="header-anchor">#</a> 什么是进程的上下文切换？</h3> <p>进程是由内核管理和调度的，所以进程的切换只能发生在内核态。进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源，还包括了内核堆栈、寄存器等内核空间的资源。通常，会把交换的信息保存在进程的 PCB，当要运行另外一个进程的时候，我们需要从这个进程的 PCB 取出上下文，然后恢复到 CPU 中，这使得这个进程可以继续执行，如下图所示：</p> <div class="custom-block center"><p><img src="https://i.loli.net/2021/08/01/sVzGlWwXuTQtIJB.png" alt="进程上下文切换.png"></p></div> <h3 id="哪些情况会引发线程上下文切换"><a href="#哪些情况会引发线程上下文切换" class="header-anchor">#</a> 哪些情况会引发线程上下文切换？</h3> <ul><li>时间片用完</li> <li>所需资源（比如内存）不足</li> <li>调用 <code>sleep</code> 主动挂起</li> <li>有更高优先级的进程需要先执行</li> <li>发生硬件中断</li></ul> <h2 id="线程"><a href="#线程" class="header-anchor">#</a> 线程</h2> <h3 id="什么是线程"><a href="#什么是线程" class="header-anchor">#</a> 什么是线程？</h3> <p>线程是进程当中的一条执行流程。同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源，但每个线程都有独立一套的寄存器和栈，这样可以确保线程的控制流是相对独立的。</p> <h3 id="线程与进程的比较"><a href="#线程与进程的比较" class="header-anchor">#</a> 线程与进程的比较？</h3> <p>线程与进程的区别如下：</p> <ul><li>进程是资源（包括内存、打开的文件等）分配的单位，线程是 CPU 调度的单位</li> <li>进程拥有一个完整的资源平台，而线程只独享必不可少的资源，如寄存器和栈</li> <li>线程同样具有就绪、阻塞、执行三种基本状态，同样具有状态之间的转换关系</li> <li>线程能减少并发执行的时间和空间开销</li></ul> <p>线程相比进程能减少开销，体现在：</p> <ul><li>线程的创建时间比进程快，因为进程在创建的过程中，还需要资源管理信息，比如内存管理信息、文件管理信息，而线程在创建的过程中，不会涉及这些资源管理信息，而是共享它们</li> <li>线程的终止时间比进程快，因为线程释放的资源相比进程少很多</li> <li>同一个进程内的线程切换比进程切换快，因为线程具有相同的地址空间（虚拟内存共享），这意味着同一个进程的线程都具有同一个页表，那么在切换的时候不需要切换页表。而对于进程之间的切换，切换的时候要把页表给切换掉，而页表的切换过程开销是比较大的</li> <li>由于同一进程的各线程间共享内存和文件资源，那么在线程之间数据传递的时候，就不需要经过内核了，这就使得线程之间的数据交互效率更高了</li></ul> <h3 id="什么是线程的上下文切换"><a href="#什么是线程的上下文切换" class="header-anchor">#</a> 什么是线程的上下文切换？</h3> <ul><li>当两个线程不是属于同一个进程时，切换的过程就跟进程上下文切换一样</li> <li>当两个线程是属于同一个进程时，因为虚拟内存是共享的，所以在切换时，虚拟内存这些资源就保持不动，只需要切换线程的私有数据、寄存器等不共享的数据</li></ul> <h2 id="调度"><a href="#调度" class="header-anchor">#</a> 调度</h2> <h3 id="什么情况下会发生调度"><a href="#什么情况下会发生调度" class="header-anchor">#</a> 什么情况下会发生调度？</h3> <ul><li>从就绪态转变为运行态</li> <li>从运行态转变为阻塞态</li> <li>从运行态转变为结束态</li></ul> <p>以上三种情况，操作系统都需要重新选择一个进程来执行，所以需要调度。调度算法大体上分为两类：</p> <ul><li>非抢占式调度算法：挑选一个进程，然后让该进程运行直到被阻塞，或者直到该进程退出，才会调用另外一个进程，也就是说不会理时钟中断这个事情</li> <li>抢占式调度算法：挑选一个进程，然后让该进程只运行某段时间，如果在该时段结束时，该进程仍然在运行时，则会把它挂起，接着调度程序从就绪队列挑选另外一个进程，这种抢占式调度处理，需要在时间间隔的末端发生时钟中断，以便把 CPU 控制返回给调度程序进行调度，也就是常说的时间片机制</li></ul> <h3 id="cpu-调度的基本原则"><a href="#cpu-调度的基本原则" class="header-anchor">#</a> CPU 调度的基本原则？</h3> <ul><li>CPU 利用率：调度程序应确保 CPU 是始终匆忙的状态，这可提高 CPU 的利用率</li> <li>系统吞吐量：吞吐量表示的是单位时间内 CPU 完成进程的数量，长作业的进程会占用较长的 CPU 资源，因此会降低吞吐量，相反，短作业的进程会提升系统吞吐量</li> <li>周转时间：周转时间是进程运行和阻塞时间总和，一个进程的周转时间越小越好</li> <li>等待时间：这个等待时间不是阻塞状态的时间，而是进程处于就绪队列的时间，等待的时间越长，用户越不满意</li> <li>响应时间：用户提交请求到系统第一次产生响应所花费的时间，在交互式系统中，响应时间是衡量调度算法好坏的主要标准</li></ul> <h3 id="有哪些调度算法"><a href="#有哪些调度算法" class="header-anchor">#</a> 有哪些调度算法？</h3> <h4 id="先来先服务算法"><a href="#先来先服务算法" class="header-anchor">#</a> 先来先服务算法</h4> <p>先来先服务（First Come First Severd, FCFS）算法是指每次从就绪队列选择最先进入队列的进程，然后一直运行，直到进程退出或被阻塞，才会继续从队列中选择第一个进程接着运行。这似乎很公平，但是当一个长作业先运行了，那么后面的短作业等待的时间就会很长，这将不利于短作业。</p> <h4 id="最短作业优先调度算法"><a href="#最短作业优先调度算法" class="header-anchor">#</a> 最短作业优先调度算法</h4> <p>最短作业优先（Shortest Job First, SJF）调度算法会优先选择运行时间最短的进程来运行，这有助于提高系统的吞吐量。但这种算法很明显对长作业不友好。</p> <h4 id="高响应比优先调度算法"><a href="#高响应比优先调度算法" class="header-anchor">#</a> 高响应比优先调度算法</h4> <p>高响应比优先 （Highest Response Ratio Next, HRRN）调度算法主要是权衡了短作业和长作业。每次进行进程调度时，先计算响应比优先级，然后把响应比优先级最高的进程投入运行，响应比优先级的计算公式：</p> <div class="custom-block center"><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>优先权</mtext><mo>=</mo><mfrac><mrow><mtext>等待时间</mtext><mo>+</mo><mtext>要求服务时间</mtext></mrow><mtext>要求服务时间</mtext></mfrac></mrow><annotation encoding="application/x-tex">优先权 = \frac{等待时间+要求服务时间}{要求服务时间}
</annotation></semantics></math></span><span aria-hidden="true" class="katex-html"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord cjk_fallback">优先权</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.04633em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.36033em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">要求服务时间</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">等待时间</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord cjk_fallback">要求服务时间</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p></div> <h4 id="时间片轮转调度算法"><a href="#时间片轮转调度算法" class="header-anchor">#</a> 时间片轮转调度算法</h4> <p>时间片轮转（Round Robin, RR）调度算法是给每个进程分配一个时间段，称为时间片（Quantum）。</p> <ul><li>如果时间片用完，进程还在运行，那么将会把此进程从 CPU 释放出来，并把 CPU 分配给另外一个进程</li> <li>如果该进程在时间片结束前阻塞或结束，则 CPU 立即进行切换</li></ul> <h4 id="最高优先级调度算法"><a href="#最高优先级调度算法" class="header-anchor">#</a> 最高优先级调度算法</h4> <p>时间片轮转算法做了个假设，即让所有的进程同等重要，大家的运行时间都一样。但是对于多用户计算机系统就有不同的看法了，它们希望调度是有优先级的，即希望调度程序能从就绪队列中选择最高优先级的进程进行运行，这称为最高优先级（Highest Priority First，HPF）调度算法。</p> <p>进程的优先级可以分为，静态优先级或动态优先级：</p> <ul><li>静态优先级：创建进程时候，就已经确定了优先级了，然后整个运行时间优先级都不会变化</li> <li>动态优先级：根据进程的动态变化调整优先级，比如进程运的行时间增加，则降低其优先级，如果进程等待时间（就绪队列的等待时间）增加，则升高其优先级，也就是随着时间的推移增加等待进程的优先级</li></ul> <h4 id="多级反馈队列调度算法"><a href="#多级反馈队列调度算法" class="header-anchor">#</a> 多级反馈队列调度算法</h4> <p>多级反馈队列（Multilevel Feedback Queue）调度算法是时间片轮转算法和最高优先级算法的综合和发展。</p> <ul><li>多级表示有多个队列，每个队列优先级从高到低，同时优先级越高时间片越短</li> <li>反馈表示如果有新的进程加入优先级高的队列时，立刻停止当前正在运行的进程，转而去运行优先级高的队列</li></ul> <h2 id="进程间的通信方式"><a href="#进程间的通信方式" class="header-anchor">#</a> 进程间的通信方式</h2> <h3 id="为什么要进行进程间通信"><a href="#为什么要进行进程间通信" class="header-anchor">#</a> 为什么要进行进程间通信？</h3> <p>程序中经常需要多个进程同时工作，这些进程需要互相通信，这就需要进程间通信。进程间的通信方式包括：</p> <ul><li>管道</li> <li>消息队列</li> <li>共享内存</li> <li>信号量</li> <li>信号</li> <li>Socket</li></ul> <h3 id="如何通过管道实现进程间通信"><a href="#如何通过管道实现进程间通信" class="header-anchor">#</a> 如何通过管道实现进程间通信？</h3> <p>在 Linux 中使用符号 <code>|</code> 就是使用了管道的功能。这种方式实际上是创建了一个匿名管道，它将前一个命令的的输出作为后一个命令的输入，比如：<code>ps auxf | grep mysql</code>。</p> <p>还有一种方式可以创建一个命名管道，它通过 <code>mkfifo</code> 命令创建，比如：<code>mkfifo myPipeline</code>。管道这种通信方式效率低，不适合进程间频繁通信。</p> <h3 id="如何通过消息队列实现进程间通信"><a href="#如何通过消息队列实现进程间通信" class="header-anchor">#</a> 如何通过消息队列实现进程间通信？</h3> <p>对于管道存在的问题，可以使用消息队列进行解决。比如，A 进程要给 B 进程发送消息，A 进程把数据放在对应的消息队列后就可以正常返回了，B 进程需要的时候再去读取数据就可以了。同理，B 进程要给 A 进程发送消息也是如此。</p> <p>但这种方式有两个问题：</p> <ul><li>通信不及时</li> <li>传送的消息大小有限制</li></ul> <p>由于进程是写入数据到内核的消息队列，所以发生从用户态到内核态的过程，读取数据同理，所以还存在状态切换的开销。</p> <h3 id="如何通过共享内存实现进程间通信"><a href="#如何通过共享内存实现进程间通信" class="header-anchor">#</a> 如何通过共享内存实现进程间通信？</h3> <p>共享内存就是拿出一块虚拟地址空间来，映射到相同的物理内存中。这样这个进程写入的东西，另外一个进程马上就能看到了，不需要再传来传去，大大提高了进程间通信的速度。</p> <div class="custom-block center"><p><img src="https://i.loli.net/2021/08/01/Qa3BSfYgqyCoLMj.png" alt="共享内存.png"></p></div> <h3 id="如何通过信号量实现进程间通信"><a href="#如何通过信号量实现进程间通信" class="header-anchor">#</a> 如何通过信号量实现进程间通信？</h3> <p>通过共享内存进行通信的方式会带来新的问题：如果多个进程同时修改同一个共享内存，很有可能就冲突了。例如两个进程都同时写一个地址，那先写的那个进程会发现内容被别人覆盖了。为了防止多进程竞争共享资源，而造成的数据错乱，需要一种保护机制，使得共享的资源，在任意时刻只能被一个进程访问。信号量就实现了这样一种保护机制。</p> <p>信号量其实是一个整型的计数器，主要用于实现进程间的互斥与同步，而不是用于缓存进程间通信的数据。信号量表示资源的数量，控制信号量的方式有两种原子操作：</p> <ul><li>P 操作：这个操作会把信号量减去 1，相减后如果信号量 &lt; 0，则表明资源已被占用，进程需阻塞等待，如果信号量 &gt;= 0，则表明还有资源可使用，进程可正常继续执行</li> <li>V 操作：这个操作会把信号量加上 1，相加后如果信号量 &lt;= 0，则表明当前有阻塞中的进程，于是会将该进程唤醒运行，如果信号量 &gt; 0，则表明当前没有阻塞中的进程</li></ul> <p>P 操作是用在进入共享资源之前，V 操作是用在离开共享资源之后，这两个操作是必须成对出现的。在下面的例子中信号量被初始化为 1：</p> <div class="custom-block center"><p><img src="https://i.loli.net/2021/08/01/sMUOdwgqEIDbPiN.png" alt="pv操作举例.png"></p></div> <h3 id="如何通过信号实现进程间通信"><a href="#如何通过信号实现进程间通信" class="header-anchor">#</a> 如何通过信号实现进程间通信？</h3> <p>上面说的几种方式都是常规状态下的工作模式。对于异常情况下的工作模式，需要用信号的方式来通知进程。</p> <p>在 Linux 中为了响应各种各样的事件，提供了几十种信号，分别代表不同的意义，通过 <code>kill -l</code> 命令可以查看所有的信号。</p> <p>在终端中，通过键盘组合键也可以发送信号：</p> <ul><li><code>Ctrl + C</code>：产生 <code>SIGINT</code> 信号，表示终止进程</li> <li><code>Ctrl + Z</code>：产生 <code>SIGTSTP</code> 信号，表示挂起进程</li></ul> <h3 id="如何通过-socket-实现进程间通信"><a href="#如何通过-socket-实现进程间通信" class="header-anchor">#</a> 如何通过 Socket 实现进程间通信？</h3> <p>前面所说的的管道、消息队列、共享内存、信号量和信号都是在同一台主机上进行进程间通信，那要想跨网络与不同主机上的进程之间通信，就需要 Socket 通信了。针对 TCP 协议的 Socket 编程模型：</p> <div class="custom-block center"><p><img src="https://i.loli.net/2021/08/01/KDGJEiz2WpLjhcN.png" alt="TCP编程模型.png"></p></div> <p>针对 UDP 协议的 Socket 编程：</p> <div class="custom-block center"><p><img src="https://i.loli.net/2021/08/01/wT5Y1NzIUK92Xnt.png" alt="udp编程模型.png"></p></div> <p>实际上，Socket 通信不仅可以跨网络与不同主机的进程间通信，还可以在同主机上进程间通信。不像 TCP 和 UDP 要绑定 IP 地址和端口，而是绑定一个本地文件，这也就是它们之间的最大区别。</p></div> <!----> <div class="content__content-bottom"></div> <footer class="page-meta"><div class="edit-link"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon edit-icon"><path d="M117.953 696.992 64.306 959.696l265.931-49.336 450.204-452.505-212.284-213.376-450.204 452.513zm496.384-296.326L219.039 797.993l-46.108-46.34L568.233 354.33l46.104 46.335zm345.357-122.99-114.45 115.04-212.288-213.377 114.45-115.035 212.288 213.371zm0 0" fill="currentColor"></path></svg> <a href="https://github.com/lxy1152/lxy1152.github.io/edit/main/interview/os/process-thread.md" target="_blank" rel="noopener noreferrer">编辑此页</a></div> <div class="meta-item update-time"><span class="label">上次编辑于:</span> <span class="info">2021年8月1日 19:23</span></div> <div class="meta-item contributors"><span class="label">贡献者: </span> <span class="info"><span title="email: 2676092082@qq.com" class="contributor">
          Xiangyu Li
        </span> <!----></span></div></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/interview/os/cpu-cache/" class="prev"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon prev-icon"><path d="M906.783 588.79c-.02 8.499-6.882 15.36-15.38 15.37l-443.7-.01 75.704 191.682c2.52 6.42.482 13.763-5.038 17.91-5.52 4.168-13.138 4.147-18.616-.092L123.228 524.175a15.362 15.362 0 0 1-6-12.165c0-4.782 2.222-9.277 6-12.185L499.753 210.35a15.388 15.388 0 0 1 9.38-3.195c3.236 0 6.502 1.034 9.236 3.103 5.52 4.147 7.578 11.49 5.038 17.91L447.683 419.84l443.72-.01c8.498.01 15.36 6.881 15.36 15.36l.02 153.6z" fill="currentColor"></path></svg>
        🧚 CPU 缓存一致性
      </a></span> <span class="next"><a href="/interview/os/lock/">
        🧟 锁
        <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon next-icon"><path d="M906.772 512c0 4.772-2.211 9.267-5.99 12.175L524.257 813.66a15.37 15.37 0 0 1-18.616.092 15.368 15.368 0 0 1-5.038-17.91l75.714-191.672h-443.73c-8.488 0-15.36-6.881-15.36-15.36v-153.6c0-8.489 6.872-15.36 15.36-15.36h443.73l-75.714-191.682a15.358 15.358 0 0 1 5.048-17.91c5.51-4.158 13.128-4.137 18.606.092l376.525 289.485a15.323 15.323 0 0 1 5.99 12.165z" fill="currentColor"></path></svg></a></span></p></div> <div class="comments-wrapper"><div class="waline-wrapper"><div id="waline-comment"></div></div></div> <!----> <div class="content__page-bottom"></div></main> <footer class="footer-wrapper"><!----> <!----> <div class="copyright">Copyright © 2021 Xiangyu Li</div></footer></div><div class="global-ui"><!----><div tabindex="-1" role="dialog" aria-hidden="true" class="pswp"><div class="pswp__bg"></div> <div class="pswp__scroll-wrap"><div class="pswp__container"><div class="pswp__item"></div> <div class="pswp__item"></div> <div class="pswp__item"></div></div> <div class="pswp__ui pswp__ui--hidden"><div class="pswp__top-bar"><div class="pswp__counter"></div> <button class="pswp__button pswp__button--close"></button> <button class="pswp__button pswp__button--share"></button> <button class="pswp__button pswp__button--fs"></button> <button class="pswp__button pswp__button--zoom"></button> <div class="pswp__preloader"><div class="pswp__preloader__icn"><div class="pswp__preloader__cut"><div class="pswp__preloader__donut"></div></div></div></div></div> <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"><div class="pswp__share-tooltip"></div></div> <button class="pswp__button pswp__button--arrow--left"></button> <button class="pswp__button pswp__button--arrow--right"></button> <div class="pswp__caption"><div class="pswp__caption__center"></div></div></div></div></div></div></div>
    <script src="/assets/js/app.a42375e9.js" defer></script><script src="/assets/js/vendors~layout-Layout.8269724e.js" defer></script><script src="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound.43b0f70d.js" defer></script><script src="/assets/js/page-🧝‍♂️进程与线程.f1df829e.js" defer></script><script src="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound~layout-Slide.99c28334.js" defer></script>
  </body>
</html>
